package com.base.cn.platform.os.dao.order.order;

import com.base.cn.platform.os.common.mybatis.BaseDao;
import com.base.cn.platform.os.entity.order.count.OrderDayNum;
import com.base.cn.platform.os.entity.order.count.OrderFormCountNum;
import com.base.cn.platform.os.entity.order.count.OrderPayTypeCountNum;
import com.base.cn.platform.os.entity.order.count.OrderPriceCountNum;
import com.base.cn.platform.os.entity.order.order.Order;
import com.base.cn.platform.os.entity.statistics.base.ZStatisticsOrderBaseCount;
import com.base.cn.platform.os.entity.statistics.trade.PayOrderFormNum;
import com.base.cn.platform.os.entity.statistics.trade.PayTypeCountNum;
import com.base.cn.platform.os.entity.statistics.users.ZStatisticsPayUserCount;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 订单Dao
 *
 * @author s.li
 * @create 2018-05-07-17:19
 */
@Mapper
public interface OrderDao extends BaseDao<Order> {

    /**
     * 获取当天订单量
     * @param dateTime 时间
     * @return 统计数据对象
     */
    List<OrderDayNum> queryOrderNowDayNum(@Param("clazz") Class<Order> clazz, @Param("dateTime") String dateTime);

    /**
     * 查询购买课程的用户量
     * @return 用户量
     */
    Integer queryBuyCourseUserNum(@Param("clazz") Class<Order> clazz);

    /**
     * 查询订单流水总金额
     * @param clazz
     * @return 订单流水总金额
     */
    double queryOrderSumPrice(@Param("clazz") Class<Order> clazz);

    /**
     * 查询统计订单价格区域的数据
     * @param clazz
     * @return OrderPriceCountNum
     */
    OrderPriceCountNum queryOrderPriceCountNum(@Param("clazz") Class<Order> clazz);

    /**
     * 查询订单支付方式占比统计数据
     * @param clazz
     * @return PayTypeCountNum
     */
    OrderPayTypeCountNum queryOrderPayTypeCountNum(@Param("clazz") Class<Order> clazz);

    /**
     * 查询订单的来源数据统计
     * @param clazz
     * @return OrderFormCountNum
     */
    OrderFormCountNum queryOrderFormCountNum(@Param("clazz") Class<Order> clazz);

    /**
     * 获取某一段时间的订单量
     * @param param 时间
     * @return 统计数据对象
     */
    List<Map<String,Object>> queryOrderDayNum(@Param("clazz") Class<Order> clazz, @Param("param") Map<String,Object> param);

    //===========================================================================================

    /**
     * 查询两个时间段内的非免费订单每天的统计数据列表
     * @return
     */
    List<ZStatisticsOrderBaseCount> queryOrderTimeSlotDayCountList(@Param("clazz") Class<Order> clazz,
                                                                   @Param("params") Map<String,String> params);

    /**
     * 查询某天的非免费订单每天的统计数据列表
     * @return
     */
    List<ZStatisticsOrderBaseCount> queryOrderOneDayCountList(@Param("clazz") Class<Order> clazz,
                                                                   @Param("queryTime") String queryTime);

    /**
     * 查询两个时间段内的非免费订单每天的统计数据总量
     * @param clazz
     * @param params
     * @return
     */
    ZStatisticsOrderBaseCount queryOrderTimeSlotDayCountSum(@Param("clazz") Class<Order> clazz,
                                                            @Param("params") Map<String,String> params);

    /**
     * 查询交易额度与订单量分布数据列表
     * @param clazz
     * @return List<Map<String,Object>>
     */
    List<Map<String,Object>> queryOrderTradeSpreadList(@Param("clazz") Class<Order> clazz,
                                                       @Param("timeSql") String timeSql);

    /**
     * 查询订单支付方式占比统计数据
     * @param clazz
     * @return PayTypeCountNum
     */
    PayTypeCountNum queryOrderPayTypeOrderNum(@Param("clazz") Class<Order> clazz,
                                              @Param("timeSql") String timeSql);

    /**
     * 查询订单的支付来源数据统计
     * @param clazz
     * @return
     */
    PayOrderFormNum queryPayOrderFormNumData(@Param("clazz") Class<Order> clazz,
                                             @Param("timeSql") String timeSql);

    /**
     * 获取指定时间段内的付款用户量统计数据列表
     * @param clazz
     * @param params
     * @return List<ZStatisticsOrderBaseCount>
     */
    List<ZStatisticsOrderBaseCount> queryOrderPayUserCountList(@Param("clazz") Class<Order> clazz,
                                    @Param("params") Map<String,Object> params);

    /**
     * 查询付款用户概况数据
     * @param clazz
     * @param timeSql 查询时间
     * @return ZStatisticsPayUserCount
     */
    ZStatisticsPayUserCount queryPayUserCountData(@Param("clazz") Class<Order> clazz,
                                                  @Param("timeSql") String timeSql);
}
